namespace Core.Contracts.Interfaces
{
    using Enums;
    using System.Collections.Generic;
    using System;

    /// <summary>
    /// Robot interface contract
    /// </summary>
    public interface IRobot : IFeatures, IConditions, IBonusModifiers, INotifyPropertyChangedEx, ICloneable
    {
        /// <summary>
        /// Obtains the robot name
        /// </summary>
        string Name { get;  }
        /// <summary>
        /// Obtains the robot description
        /// </summary>
        string Description { get; }
        /// <summary>
        /// Obtain the robot faction
        /// </summary>
        FactionsEnum Faction { get; }
        /// <summary>
        /// Obtains the robot technology level
        /// </summary>
        RobotTechnologyLevel TechnologyLevel { get;}
        /// <summary>
        /// Obtains the robot size
        /// </summary>
        RobotSizesEnum Size { get;  }
        /// <summary>
        /// Obtains the robot slots
        /// </summary>
        IEnumerable<ISlot> Slots { get;  }
        /// <summary>
        /// Obtains the robot modules
        /// </summary>
        IEnumerable<IModule> Modules { get; }
        /// <summary>
        /// Obtains the fitted head modules
        /// </summary>
        IEnumerable<IModule> HeadModules { get; }
        /// <summary>
        /// Obtains the fitted chassis modules
        /// </summary>
        IEnumerable<IModule> ChassisModules { get; }
        /// <summary>
        /// Obtains the fitted legs modules
        /// </summary>
        IEnumerable<IModule> LegModules { get; }
        /// <summary>
        /// Adds a module
        /// </summary>
        /// <param name="module">The IModule instance to add</param>
        /// <param name="recalc">True to recalculate the features values</param>
        bool AddModule(IModule module, bool recalc);
        /// <summary>
        /// Removes a module
        /// </summary>
        /// <param name="module">The IModule instance to remove</param>
        /// <param name="recalc">True to recalculate the features values</param>
        void RemoveModule(IModule module, bool recalc);
        /// <summary>
        /// Removes all modules
        /// </summary>
        void ClearModules();
        /// <summary>
        /// Obtains or defines the robot pilot
        /// </summary>
        IAgent Pilot { get; set; }
    }
}